<?php
/**
 * Implementa��o do padr�o DAO para a classe Processo.
 * Essas fun��es n�o devem ser chamadas diretamente, sendo seu uso feito via a classe Processo.
 **/
//if( !function_exists('__autoload') )
//{
//    function __autoload($class_name) {
  //  require_once $class_name . '.php';    
//    }
//}

require_once 'Licitacao.php';
require_once 'Processo.php';
require_once('DataAccess.php');
class ProcessoDAO
{
	

      private $database;

      public function __construct( )
      {
               $this->database = DataAccess::getConnection();
      }
      
	public function Salvar( $processo )
	{
		$servidorId = $processo->responsavel->id;
		$processo->dataCriacao = date('Y-m-d');  
		$licitacao = $processo->licitacao;
		
		$consulta = $this->database->Fetch("BEGIN");
		
		if( $consulta != FALSE )
		{
			
			$consulta = $this->database->Fetch("INSERT INTO t_compra(
												t_usuario_id, objeto, justificativa, valor_total, responsabilidade_ifal, 
												responsabilidade_contratado, sancoes, outras_informacoes, 
												status, data_criacao, processo_tipo, fundamento_legal, info_recebimento, concluido, t_licitacao_id, informacoes_adicionais_licitacao)
												VALUES ( $servidorId , '$processo->objeto','$processo->justificativa','$processo->valorTotal','$processo->responsabilidadeIFAL','$processo->responsabilidadeContratado',
	 											'$processo->sancoes', '$processo->outrasInformacoes',
	 											0, '$processo->dataCriacao', '$processo->tipoProcesso','$processo->fundamentoLegal','$processo->infoRecebimento', '$processo->concluido', $licitacao->id, '$processo->informacoesAdicionaisLicitacao')");
			
			if( $consulta && mysql_affected_rows() > 0 )
			{
				$id = DataAccess::getId();
				
				if($processo->itens != NULL){
//					for( $i = 0; $i < count ( $processo->itens ); $i++ )
//					{
					
						try{
							$materialCompraCampusDao = new MaterialCompraCampus();
							$materialCompraCampusDao->SavarArrayTermoReferencia($processo->itens, $id);
//							$processo->itens[$i]->setCompraId( $id );
//							$processo->itens[$i]->Salvar();
						
						}catch(Exception $e)
						{
							$this->database->Fetch("ROLLBACK");
							throw new Exception("Problema na inserção dos itens do processo de compras no banco de dados. Erro:".mysql_error()."");
						}
				
//					}
				
				}
				$this->database->Fetch("COMMIT");
				return $id;
			}
			else
			{
				$this->database->Fetch("ROLLBACK");
				throw new Exception("Problema na inserção do processo de compras no banco de dados. Erro:".mysql_error()."");
			}
		}
		else
		{
			throw new Exception("Problema na inser��o do processo de compras no banco de dados. Erro:".mysql_error()."");
		}
		
	}
	
	public function Atualizar( $processo )
      {
      	$consulta = $this->database->Fetch("BEGIN");
      		
      	if ( $consulta ){
      			
      		$compraCampusDAO = new CompraCampus();
      		$result = $compraCampusDAO->ExcluirPorProcesso($processo->id);
      		if(!$result)
      			return FALSE;
      		
      		$materialDao = new Material();
      		$result = $materialDao->RemoverPorProcesso($processo->id);
      		if(!$result)
      			return FALSE;

      		
      		$servidorId = $processo->responsavel->id;
			$processo->dataCriacao = date('Y-m-d');  
			$licitacao = $processo->licitacao;								
												
			$consulta = $this->database->Fetch("UPDATE t_compra SET
						 t_usuario_id = '$servidorId', 
						 objeto = '$processo->objeto',						 
						 justificativa = '$processo->justificativa',				
						 fundamento_legal = '$processo->fundamentoLegal',						 
						 valor_total = '$processo->valorTotal',
						 info_recebimento = '$processo->infoRecebimento',
						 responsabilidade_ifal = '$processo->responsabilidadeIFAL',
						 responsabilidade_contratado = '$processo->responsabilidadeContratado',
						 sancoes = '$processo->sancoes',
						 outras_informacoes = '$processo->outrasInformacoes',
						 status = '$processo->status',
						 data_criacao = '$processo->dataCriacao',
						 processo_tipo = '$processo->tipoProcesso',
						 concluido = '$processo->concluido',
						 t_licitacao_id = $licitacao->id, 
						 informacoes_adicionais_licitacao = '$processo->informacoesAdicionaisLicitacao'
						 WHERE id = '$processo->id'");
    	
      		if( $consulta ){
      				if($processo->itens != NULL){
	
					
						try{
							$materialCompraCampusDao = new MaterialCompraCampus();
							$materialCompraCampusDao->SavarArrayTermoReferencia($processo->itens, $processo->id);

						}catch(Exception $e)
						{
							$this->database->Fetch("ROLLBACK");
							throw new Exception("Problema na inserção dos itens do processo de compras no banco de dados. Erro:".mysql_error()."");
						}
				

				
				}
            	$consulta = $this->database->Fetch("COMMIT");
            	return TRUE;
         	}
        	else{
            	$consulta = $this->database->Fetch("ROLLBACK");
         	   	throw new Exception("Problema na inserção 2 do processo de compras no banco de dados. Erro:".mysql_error()."");
            	return FALSE;
         	}
        }
        else
        {
          	$consulta = $this->database->Fetch("ROLLBACK");
          	throw new Exception("Problema na inserção 1 do processo de compras no banco de dados. Erro:".mysql_error()."");
           	return FALSE;
        }
      }
	
	public function CarregarProcessosPorStatus( $servidor )
	{
		$campusId = $servidor->ObterCampus()->id;
		      
		$nivelAcesso = Processo::getServidorNivelAcesso( $servidor->perfil );
      
		$consulta = $this->database->Fetch("SELECT DISTINCT c.* 
											FROM t_compra c,
											t_usuario u, 
											t_setor s, 
											t_campus cp
									      	WHERE c.status >= $nivelAcesso[0]
									      	AND c.status <= $nivelAcesso[1]
									      	AND c.t_compra_juncao_id = 0
									      	AND cp.id = $campusId
									      	AND s.t_campus_id = cp.id
											AND u.t_setor_id = s.id
											AND c.t_usuario_id = u.id");

		if( $consulta )
		{
		
			$rows = $this->database->getRow();
			      
			$processos = Processo::ArrayParaObjetos( $rows );
		
			return $processos;
		}
		else
			return FALSE;
	}
	
	public function CarregarProcesso( $id )
    {
		$consulta = $this->database->Fetch(" SELECT * FROM t_compra WHERE id = '$id' ");

		if( $consulta != FALSE )
        {
			$rows = $this->database->getRow();
			$processo = Processo::ArrayParaObjetos( $rows );
			return $processo[0];
        }
		else if( $consulta == FALSE || mysql_num_rows( $consulta ) == 0 )
			return FALSE;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
      public function AvaliarEstrategiaContratacao( $processo, $idLicitacao, $fundamentoLegal, $justificativaLegal )
      {
             $resultado = $this->database->Fetch(" UPDATE t_compra SET t_licitacao_id = '$idLicitacao', fundamento_legal = '$fundamentoLegal', justificativa = '$justificativaLegal' WHERE ID = '$processo->id.' ");
             if( $resultado )
                 return true;
             else
                 return false;
      }

	public function RealizarDespacho( $processo, $servidor, $avaliacao, $despacho )
	{
		$processoId = $processo->id;
		$status = $processo->status;
		$data = date('Y-m-d');		
		     
		if( $avaliacao == 'aceito' )
		{
			if( $status == 0 )
				$status = 1;
			else if( $status == 33 )
				$status = 5;
			else
				$status += 2;
		}
		else if( $avaliacao == 'negado' )
		{
			if( $status == 0 )
				$status = 2;
			else if( $status == 33 )
				$status = 6;
			else
				$status += 3;
		}
             
		$consulta = $this->database->Fetch("BEGIN");
		if( $consulta != FALSE )
		{
			$consulta = $this->database->Fetch("INSERT INTO t_despacho
												(t_usuario_id, t_compra_id, parecer, status, data) 
												VALUES( 
												'$servidor->id', 
												$processoId, 
												'$despacho', 
												'$status', 
												'$data')");
			if( $consulta && mysql_affected_rows() > 0)
			{
				$consulta = $this->database->Fetch(" UPDATE t_compra SET STATUS = '$status' WHERE ID = $processoId ");
				if( $consulta )
				{
					$this->database->Fetch("COMMIT");
					return TRUE;
				}
				else
				{
					$this->database->Fetch("ROLLBACK");
					return FALSE;
				}
			}
			else
			{
				$this->database->Fetch("ROLLBACK");
				return FALSE;
			}
		}
	}
      
	
	
	public function CarregarDespacho( $processoId )
    {
		$consulta = $this->database->Fetch("SELECT id, t_usuario_id, t_compra_id, parecer, status, data 
											FROM t_despacho 
											WHERE t_compra_id = '$processoId' ");
		if( $consulta != FALSE and mysql_num_rows( $consulta ) > 0 )
		{
			$rows = $this->database->getRow();
			$despachos = array();
			for($i = 0; $i< count($rows); $i++ )
			{
				$despachos[$i] = array();
				$despachos[$i]['parecer'] = $rows[$i]['parecer'];
				$despachos[$i]['status'] = $rows[$i]['status'];
				$despachos[$i]['servidor'] = $rows[$i]['t_usuario_id'];
				$despachos[$i]['data'] = $rows[$i]['data'];
			}
			return $despachos;
		}
	}
      
	public function CarregarProcessosPorEspecificacao( $especificacao, $servidor )
	{
		$unidadeId = $servidor->ObterCampus()->id;
	
		switch( $servidor->perfil )
      	{
      		case 0:
      			$statusMin = 0;
      			$statusMax = 33;
      			break;
      		case 1:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 2:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 3:
      			$statusMin = 1;
      			$statusMax = 1;
      			break;
      		case 4:
      			$statusMin = 3;
      			$statusMax = 33;
      			break;
      		
      	}
      		
		if( $especificacao == 1 ) // consulta apenas por processos que contenham material
			$consulta = $this->database->Fetch("SELECT DISTINCT c.* 
  												FROM t_compra c, 
  												t_itens_detalhamento id, 
  												t_usuario u, 
												t_setor s, 
												t_campus cp
  												WHERE id.t_compra_id = c.id
  												AND id.t_material_unidade_id <> 0
  												AND c.status >= $statusMin
  												AND c.status <= $statusMax
												AND cp.id = $unidadeId
												AND s.t_campus_id = cp.id
												AND u.t_setor_id = s.id
												AND c.t_usuario_id = u.id
												AND c.t_compra_juncao_id IS NULL
												ORDER BY ID");	
		else if( $especificacao == 2 ) // consulta apenas por processos que contenham apenas servi�os
			$consulta = $this->database->Fetch("SELECT DISTINCT c.* 
  												FROM t_compra c, 
  												t_itens_detalhamento id, 
  												t_usuario u, 
												t_setor s, 
												t_campus cp
  												WHERE id.t_compra_id = c.id
  												AND id.t_servico_id <> 0
  												AND c.status >= $statusMin
  												AND c.status <= $statusMax
												AND cp.id = $unidadeId
												AND s.t_campus_id = cp.id
												AND u.t_setor_id = s.id
												AND c.t_usuario_id = u.id
												AND c.t_compra_juncao_id IS NULL
												ORDER BY ID");
		if ( $consulta and mysql_num_rows( $consulta ) > 0 )
		{
			$rows = $this->database->getRow();
			$processos = Processo::ArrayParaObjetos( $rows );
			return $processos;	
		}
		else
			return FALSE;
	  }
	  
	public function CarregarProcessosPorCategoria( $categoriaId, $servidor )
	{
		$unidadeId = $servidor->ObterCampus()->id;
      		
      	switch( $servidor->perfil )
      	{
      		case 0:
      			$statusMin = 0;
      			$statusMax = 33;
      			break;
      		case 1:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 2:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 3:
      			$statusMin = 1;
      			$statusMax = 1;
      			break;
      		case 4:
      			$statusMin = 3;
      			$statusMax = 33;
      			break;
      		
      	}
      		
      	$consulta = $this->database->Fetch("SELECT DISTINCT c.*
											FROM t_compra c, 
											t_itens_detalhamento id, 
											t_material_unidade mu, 
											t_material m, 
											t_categoria ct, 
											t_usuario u, 
											t_setor s, 
											t_campus cp
											WHERE id.t_compra_id = c.id
											AND mu.id = id.t_material_unidade_id
											AND m.id = mu.t_material_id
											AND ct.id = m.t_categoria_id
											AND ct.id = $categoriaId
											AND c.status >= $statusMin
  											AND c.status <= $statusMax
											AND cp.id = $unidadeId
											AND s.t_campus_id = cp.id
											AND u.t_setor_id = s.id
											AND c.t_compra_juncao_id IS NULL
											ORDER BY id");
      		
      	if ( $consulta and mysql_num_rows( $consulta ) > 0 )
		{
			$rows = $this->database->getRow();
			$processos = Processo::ArrayParaObjetos( $rows );
				
			return $processos;  	
		}
      	else
      		return FALSE;
	}
	  
	
	
	public function CarregarProcessosPorServico( $servicoId, $servidor )
	{
		$unidadeId = $servidor->ObterCampus()->id;
      		
		switch( $servidor->perfil )
      	{
      		case 0:
      			$statusMin = 0;
      			$statusMax = 33;
      			break;
      		case 1:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 2:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 3:
      			$statusMin = 1;
      			$statusMax = 1;
      			break;
      		case 4:
      			$statusMin = 3;
      			$statusMax = 33;
      			break;
      		
      	}
      		
		$consulta = $this->database->Fetch("SELECT DISTINCT c.* 
											FROM t_compra c, 
											t_itens_detalhamento id, 
											t_servico sv,
											t_usuario u, 
											t_setor s, 
											t_campus cp
											WHERE c.id = id.t_compra_id
											AND id.t_material_unidade_id = 0 
											AND sv.id = $servicoId 
											AND c.status >= $statusMin
											AND c.status <= $statusMax
											AND cp.id = $unidadeId
											AND s.t_campus_id = cp.id
											AND u.t_setor_id = s.id
											AND c.t_usuario_id = u.id
											AND c.t_compra_juncao_id IS NULL
											ORDER BY id");
		      	
		if ( $consulta and mysql_num_rows( $consulta ) > 0)
		{
			$rows = $this->database->getRow();
			$processos = Processo::ArrayParaObjetos( $rows );	 			
			return $processos;
		}
		else
			return FALSE;	
	}
	
	public function CarregarLicitacao( $licitacaoId )
	{
		$licitacao = new Licitacao();
		$licitacaoSelected = $licitacao->CarregarLicitacao($licitacaoId);
		return $licitacaoSelected;
		/*
		$consulta = $this->database->Fetch(" SELECT * FROM t_licitacao WHERE id = $licitacaoId");
		
		if( $consulta != FALSE and mysql_num_rows( $consulta ) > 0 )
		{
			$rows = $this->database->getRow();
			$licitacao = array();
			$licitacao[0] = $rows[0]['id'];
			$licitacao[1] = $rows[0]['sigla']." - ".$rows[0]['modalidade'];

			return $licitacao;
		}
		else if( mysql_num_rows( $consulta ) == 0 )
		{
			return FALSE;
		}
		*/
      }
	  
	public function CalcularValorTotal( $processo )
	{
		$consulta = $this->database->Fetch("SELECT SUM(mu.valor*id.quantidade) as valor_total_atualizado,
											c.* 
											FROM t_material_unidade mu, 
											t_itens_detalhamento id,
											t_compra c
											WHERE c.id = $processo->id  
											AND id.t_compra_id = c.id
											AND mu.id = id.t_material_unidade_id");
		
		if ( $consulta and mysql_num_rows( $consulta ) > 0)
		{
			$rows = $this->database->getRow();
			$processos = Processo::ArrayParaObjetos( $rows );	 	
			$processos[0]->valorTotal = $rows[0]['valor_total_atualizado'];

			return $processos[0];
		}
		else
			return FALSE;
	}
	
	public function VerificarStatus( $processoId )
	{
		$consulta = $this->database->Fetch("SELECT status from t_compra WHERE t_compra.id = $processoId ");
		
		if ( $consulta and mysql_num_rows( $consulta ) > 0)
		{
			$rows = $this->database->getRow();
			$status = $rows[0]['status'];
			return $status;
		}
	}
	
	public function CarregarLicitacoes()
	{
		$consulta = $this->database->Fetch(" SELECT * from t_licitacao ");
		
		if ( $consulta and mysql_num_rows( $consulta ) > 0)
		{
			$rows = $this->database->getRow();
			
			$licitacao = array();
			for( $i = 0; $i < count($rows); $i++ )
			{
				$l = array();
				$l[] = $rows[$i]['id'];
				$l[] = $rows[$i]['sigla']." - ".$rows[$i]['modalidade'];
				$licitacao[] = $l;
			}
			return $licitacao;
		}
		else
			return FALSE;
	}
	
	public function CarregarProcessosPorServidor( $servidor )
    {

               $consulta = $this->database->Fetch(" SELECT * FROM t_compra WHERE t_usuario_id = '$servidor->id' ");

               if ( $consulta != FALSE )
               {
                  $rows = $this->database->getRow();
				  $processos = Processo::ArrayParaObjetos( $rows );
				  return $processos;
               }
               else if( mysql_num_rows( $consulta ) == 0 )
               {
                  return FALSE;
               }
     }
     
     public static function CarregarProcessosNaoConcluidos(){
               $database = DataAccess::getConnection();
     	
     	$consulta = $database->Fetch(" SELECT * FROM t_compra WHERE concluido = 0 AND t_usuario_id = ".$_SESSION['servidorId']);

               if ( $consulta != FALSE )
               {
                  $rows = $database->getRow();
				  $processos = Processo::ArrayParaObjetos( $rows );
				  return $processos;
               }
               else if( mysql_num_rows( $consulta ) == 0 )
               {
                  return FALSE;
               }     
     
     }
     
	 public static function carregarProcessosSemReserva(){
	 $database = DataAccess::getConnection();
     	
     	$consulta = $database->Fetch(" SELECT * FROM t_compra WHERE concluido = 1 AND status = 0 ");

               if ( $consulta != FALSE )
               {
                  $rows = $database->getRow();
				  $processos = Processo::ArrayParaObjetos( $rows );
				  return $processos;
               }
               else if( mysql_num_rows( $consulta ) == 0 )
               {
                  return FALSE;
               }
     }
     
     public static function excluirProcessNaoConcluido($idProcesso){
     		$database = DataAccess::getConnection();
     		
     		$consulta = $database->Fetch("BEGIN");
		
			if ( $consulta )
    		{	
    			$compraCampusDAO = new CompraCampus();
    			$result = $compraCampusDAO->ExcluirPorProcesso($idProcesso);
    			if(!$result)
    				return FALSE;

    			$materialDao = new Material();
    			$result = $materialDao->RemoverPorProcesso($idProcesso);
    			if(!$result)
    				return FALSE;
    				
    			//$consulta = $database->Fetch(" DELETE FROM t_material_campus WHERE t_material_id.t_compra_id = '$idProcesso' ");
            	$consulta = $database->Fetch(" DELETE FROM t_servico WHERE t_compra_id = '$idProcesso' ");
    			$consulta = $database->Fetch(" DELETE FROM t_compra WHERE id = '$idProcesso' AND concluido = 0 ");
               	
            	if( $consulta )
           		{
           			$consulta = $database->Fetch("COMMIT");
           			return TRUE;
           		}
           		else
           		{
          			$consulta = $database->Fetch("ROLLBACK");
           			return FALSE;
           		}
          
    		}
    		else
    		{
    			$consulta = $this->database->Fetch("ROLLBACK");
            	return FALSE;
    		};
     }
     
     
}
?>